<?php

namespace app\common\lib;

/**
 * 基于类反射机制处理工厂模式
 */
class ClassArr {

    /**
     * 短信类映射
     * @return array
     */
    public static function smsClassStat() {
        return [
            'ali'   => 'app\common\lib\sms\AliSms',
            'baidu' => 'app\common\lib\sms\BaiduSms',
            'jd'    => 'app\common\lib\sms\JdSms',
        ];
    }

    /**
     * 文件上传类映射
     * @return array
     */
    public static function uploadClassStat() {
        return [
            'text'  => 'app\common\lib\upload\Text',
            'image' => 'app\common\lib\upload\Image',
            'video' => 'app\common\lib\upload\Video',
        ];
    }

    /**
     * 类实例化
     * @param $type
     * @param $classs
     * @param array $params
     * @param bool $needInstance
     * @return bool|mixed|object
     * @throws \ReflectionException
     */
    public static function initClass($type, $classs, $params = [], $needInstance = false) {
        // 如果我们工厂模式调用的方法是静态的，那么我们这个地方返回类库 AliSms
        // 如果不是静态的呢，我们就需要返回 对象
        if (!array_key_exists($type, $classs)) {
            return false;
        }
        $className = $classs[$type];

        // new ReflectionClass('A') => 建立A反射类
        // ->newInstanceArgs($args)  => 相当于实例化A对象
        return $needInstance == true ? (new \ReflectionClass($className))->newInstanceArgs($params) : $className;
    }
}